package com.felhr.serialportexample.utils;

import com.google.gson.Gson;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Created by Administrator on 2017/9/20.
 */

public class GsonUtils {


  /**
   * 解析Json字符串转化成Bean
   *
   * @param json
   * @param clazz
   * @return
   * @author 詹杰
   * @time 2017-3-28
   */
  public static <T> T json2Bean(String json, Class<T> clazz) {
    Gson gson = new Gson();
    return gson.fromJson(json, clazz);
  }

  /**
   * 将Bean转化成Json字符串
   *
   * @param obj
   * @return
   * @author 詹杰
   * @time 2017-3-28
   */
  public static String bean2Json(Object obj) {
    Gson gson = new Gson();
    return gson.toJson(obj);
  }

  /**
   * 解析固定格式数据
   *
   * 如：{"success":true,"data":##} //##为泛型
   *
   * @param json
   * @param parentCls 数据格式类对象：上面数据格式
   * @param entityCls 实际解析数据类对象：上面##，##为集合时，entityCls为集合内的类的对象
   * @return 返回解析后类的对象
   * @author 詹杰
   * @time 2017-3-28
   */
  public static <T> T json2Bean(String json, final Class<?> parentCls, Class<?> entityCls) {
    Gson gson = new Gson();
    Type objectType = type(parentCls, entityCls);
    return gson.fromJson(json, objectType);
  }

//  public static <T> T json2Bean4Base(String json, Class<?> entityCls) {
//    Gson gson = new Gson();
//    Type objectType = type(BaseBean.class, entityCls);
//    BaseBean<T> bean = gson.fromJson(json, objectType);
//    return bean.getData();
//  }
  /**
   * 获取数据类型
   *
   * @param raw
   * @param args
   * @return
   * @author 詹杰
   * @time 2017-3-28
   */
  public static ParameterizedType type(final Class<?> raw, final Type... args) {
    return new ParameterizedType() {
      public Type getRawType() {
        return raw;
      }

      public Type[] getActualTypeArguments() {
        return args;
      }

      public Type getOwnerType() {
        return null;
      }
    };
  }

  /**
   * 获取传入对象上的泛型T的Class对象
   *
   * @param obj
   * @return
   * @author 詹杰
   * @time 2017-3-28
   */
  public static Class<?> getTClass(Object obj) {
    Type genType = obj.getClass().getGenericSuperclass();
    Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
    return  (Class<?>) params[0];
  }
}
